package ar.uba.fi.algo3.algoflight.view.pistas;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import ar.uba.fi.algo3.algoflight.model.pistas.Helipuerto;
import ar.uba.fi.algo3.algoflight.model.pistas.Pista;
import ar.uba.fi.algo3.algoflight.model.pistas.PistaDobleEntrada;
import ar.uba.fi.algo3.algoflight.model.pistas.PistaLarga;
import ar.uba.fi.algo3.algoflight.model.pistas.PistaSimple;

public class FactoryVistaPista {

	private Map<Class<? extends Pista>, Class<? extends VistaPista>> listaDeVistasPistas;

	public FactoryVistaPista() {
		listaDeVistasPistas = new HashMap<Class<? extends Pista>, Class<? extends VistaPista>>();
		this.rellenarListaPistas();
	}

	private void rellenarListaPistas() {
		listaDeVistasPistas.put(PistaSimple.class, VistaPistaSimple.class);
		listaDeVistasPistas.put(PistaLarga.class, VistaPistaLarga.class);
		listaDeVistasPistas.put(PistaDobleEntrada.class,
				VistaPistaDobleEntrada.class);
		listaDeVistasPistas.put(Helipuerto.class, VistaHelipuerto.class);
	}

	public VistaPista crearVistaPista(Pista pista) throws IOException {

		VistaPista vistaPista = null;
		Constructor<?>[] constructores = listaDeVistasPistas.get(
				pista.getClass()).getConstructors();

		try {
			vistaPista = (VistaPista) constructores[0].newInstance(pista);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

		return vistaPista;
	}
}
